package com.fhz.recyclerviewtest

import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.chad.library.adapter.base.BaseMultiItemAdapter
import com.fhz.recyclerviewtest.databinding.RvLayoutBinding
import com.fhz.recyclerviewtest.databinding.RvLayoutOtherBinding
import kotlin.random.Random

/**
 * 时间:2023/3/31
 * @author Mr.Feng
 * 简述: 适配器
 */
class TestAdapter(data: List<User>) : BaseMultiItemAdapter<User>(data) {

    // 类型 1 的 viewholder
    class ItemVH(val viewBinding: RvLayoutBinding) : RecyclerView.ViewHolder(viewBinding.root)

    // 类型 2 的 viewholder
    class HeaderVH(val viewBinding: RvLayoutOtherBinding) : RecyclerView.ViewHolder(viewBinding.root)

    // 在 init 初始化的时候，添加多类型
    init {
        addItemType(ITEM_TYPE, object : OnMultiItemAdapterListener<User, ItemVH> { // 类型 1
            override fun onCreate(context: Context, parent: ViewGroup, viewType: Int): ItemVH {
                // 创建 viewholder
                val viewBinding = RvLayoutBinding.inflate(LayoutInflater.from(context), parent, false)
                return ItemVH(viewBinding)
            }

            override fun onBind(holder: ItemVH, position: Int, item: User?) {
                // 绑定 item 数据

            }
        }).addItemType(SECTION_TYPE, object : OnMultiItemAdapterListener<User, HeaderVH> { // 类型 2
            override fun onCreate(context: Context, parent: ViewGroup, viewType: Int): HeaderVH {
                // 创建 viewholder
                val viewBinding = RvLayoutOtherBinding.inflate(LayoutInflater.from(context), parent, false)
                return HeaderVH(viewBinding)
            }

            override fun onBind(holder: HeaderVH, position: Int, item: User?) {
                // 绑定 item 数据
            }

            override fun isFullSpanItem(itemType: Int): Boolean {
                // 使用GridLayoutManager时，此类型的 item 是否是满跨度
                return true
            }

        }).onItemViewType { position, list -> // 根据数据，返回对应的 ItemViewType
            if (list[position].layoutId == 0) {
                SECTION_TYPE
            } else {
                ITEM_TYPE
            }
        }
    }

    companion object {
        private const val ITEM_TYPE = 0
        private const val SECTION_TYPE = 1
    }
}